package com.serviportales.serviquality.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.stereotype.Repository;

import com.serviportales.serviportales.dao.GenericHibernateDAO;
import com.serviportales.serviportales.exceptions.DAOException;
import com.serviportales.serviquality.model.CalProyectoNodo;
import com.serviportales.serviquality.model.ProyectoNodo;
import com.serviportales.serviquality.model.ProyectoUser;

@Repository
public class CalProyectoNodoDAO extends GenericHibernateDAO<CalProyectoNodo> {

	private static final long serialVersionUID = 1L;

	@Override
	public DetachedCriteria getBasicDetachedCriteria(CalProyectoNodo calProyectoNodo) throws DAOException {
		try {
			DetachedCriteria criteria = DetachedCriteria.forClass(ProyectoNodo.class);
			return criteria;
		} catch (Exception e) {
			throw new DAOException(e.getMessage(), e);
		}

	}

	public CalProyectoNodo selectByID(Serializable codigo) {
		return getHibernateTemplate().get(CalProyectoNodo.class, codigo);
	}

	@SuppressWarnings("unchecked")
	public List<CalProyectoNodo> selectCreateTree(ProyectoUser proyectoUser) {
		String strQuery = "from CalProyectoNodo as calProyectoNodo " + //
				"join fetch calProyectoNodo.proyectoUser " + //
				"join fetch calProyectoNodo.proyectoUser.proyectoUserPK.proyecto " + //				
				"join fetch calProyectoNodo.proyectoNodo " + //
				"left join fetch calProyectoNodo.proyectoNodo.parent " + //
				"left join fetch calProyectoNodo.proyectoNodo.parent.proyectoNodoPK.proyecto " + //
				"left join fetch calProyectoNodo.proyectoNodo.parent.proyectoNodoPK.nodo " + //
				"left join fetch calProyectoNodo.proyectoNodo.parent.proyectoNodoPK.nodo.nodoPK.tipoNodo " + //
				"join fetch calProyectoNodo.proyectoNodo.proyectoNodoPK.proyecto " + //
				"join fetch calProyectoNodo.proyectoNodo.proyectoNodoPK.nodo " + //
				"join fetch calProyectoNodo.proyectoNodo.proyectoNodoPK.nodo.nodoPK.tipoNodo " + //
				"where calProyectoNodo.proyectoNodo.proyectoNodoPK.proyecto.codigo = :cdProyecto " + //
				"and calProyectoNodo.proyectoUser.proyectoUserPK.userId = :userId " + //
				"order by calProyectoNodo.proyectoNodo.proyectoNodoPK.nodo.nodoPK.tipoNodo.nivel";
		Query query = getSession().createQuery(strQuery);
		query.setString("cdProyecto", proyectoUser.getProyectoUserPK().getProyecto().getCodigo());
		query.setLong("userId", proyectoUser.getProyectoUserPK().getUserId());
		return query.list();
	}

	@SuppressWarnings("unchecked")
	public List<CalProyectoNodo> selectByProyectoNodo(ProyectoNodo proyectoNodo) {
		String strQuery = "from CalProyectoNodo as calProyectoNodo " + //
				"join fetch calProyectoNodo.proyectoUser " + //
				"join fetch calProyectoNodo.proyectoNodo " + //
				"left join fetch calProyectoNodo.proyectoNodo.parent " + //
				"left join fetch calProyectoNodo.proyectoNodo.parent.proyectoNodoPK.proyecto " + //
				"left join fetch calProyectoNodo.proyectoNodo.parent.proyectoNodoPK.nodo " + //
				"left join fetch calProyectoNodo.proyectoNodo.parent.proyectoNodoPK.nodo.nodoPK.tipoNodo " + //
				"join fetch calProyectoNodo.proyectoNodo.proyectoNodoPK.proyecto " + //
				"join fetch calProyectoNodo.proyectoNodo.proyectoNodoPK.nodo " + //
				"join fetch calProyectoNodo.proyectoNodo.proyectoNodoPK.nodo.nodoPK.tipoNodo " + //
				"where calProyectoNodo.proyectoNodo.proyectoNodoPK.proyecto.codigo = :cdProyecto " + //
				"and calProyectoNodo.proyectoNodo.proyectoNodoPK.nodo.nodoPK.tipoNodo.codigo = :cdTipoNodo " + //
				"and calProyectoNodo.proyectoNodo.proyectoNodoPK.nodo.nodoPK.codigo = :cdNodo";
		Query query = getSession().createQuery(strQuery);
		query.setString("cdProyecto", proyectoNodo.getProyectoNodoPK().getProyecto().getCodigo());
		query.setString("cdTipoNodo", proyectoNodo.getProyectoNodoPK().getNodo().getNodoPK().getTipoNodo().getCodigo());
		query.setString("cdNodo", proyectoNodo.getProyectoNodoPK().getNodo().getNodoPK().getCodigo());
		return query.list();
	}

	@SuppressWarnings("unchecked")
	public CalProyectoNodo selectByUnique(CalProyectoNodo calProyectoNodo) {
		String strQuery = "from CalProyectoNodo as calProyectoNodo " + //
				"join fetch calProyectoNodo.proyectoUser " + //
				"join fetch calProyectoNodo.proyectoNodo " + //
				"left join fetch calProyectoNodo.proyectoUser.proyectoUserPK.proyecto " + //
				"left join fetch calProyectoNodo.proyectoNodo.parent " + //
				"left join fetch calProyectoNodo.proyectoNodo.parent.proyectoNodoPK.proyecto " + //
				"left join fetch calProyectoNodo.proyectoNodo.parent.proyectoNodoPK.nodo " + //
				"left join fetch calProyectoNodo.proyectoNodo.parent.proyectoNodoPK.nodo.nodoPK.tipoNodo " + //
				"join fetch calProyectoNodo.proyectoNodo.proyectoNodoPK.proyecto " + //
				"join fetch calProyectoNodo.proyectoNodo.proyectoNodoPK.nodo " + //
				"join fetch calProyectoNodo.proyectoNodo.proyectoNodoPK.nodo.nodoPK.tipoNodo " + //
				"where calProyectoNodo.proyectoNodo.proyectoNodoPK.proyecto.codigo = :cdProyecto " + //
				"and calProyectoNodo.proyectoNodo.proyectoNodoPK.nodo.nodoPK.tipoNodo.codigo = :cdTipoNodo " + //
				"and calProyectoNodo.proyectoNodo.proyectoNodoPK.nodo.nodoPK.codigo = :cdNodo " + //
				"and calProyectoNodo.proyectoUser.proyectoUserPK.proyecto.codigo = :cdProyecto " + //
				"and calProyectoNodo.proyectoUser.proyectoUserPK.userId = :userId";

		Query query = getSession().createQuery(strQuery);
		query.setString("cdProyecto", calProyectoNodo.getProyectoNodo().getProyectoNodoPK().getProyecto().getCodigo());
		query.setString("cdTipoNodo", calProyectoNodo.getProyectoNodo().getProyectoNodoPK().getNodo().getNodoPK().getTipoNodo().getCodigo());
		query.setString("cdNodo", calProyectoNodo.getProyectoNodo().getProyectoNodoPK().getNodo().getNodoPK().getCodigo());
		query.setLong("userId", calProyectoNodo.getProyectoUser().getProyectoUserPK().getUserId());

		List<CalProyectoNodo> lista = query.list();
		return lista.size() > 0 ? lista.get(0) : null;
	}
}
